<?php

declare(strict_types=1);

namespace app\eslib;

use Attribute;

/**
 * 接口声明 注解类
 * 需要 PHP 8.0 以上
 * @version 1.0.0
 * @see https://blog.csdn.net/nexttrial/article/details/119572399
 */
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class ApiDocer
{
    public $desc;
    public $url;
    public $method;
    public $cross;
    /**
     * 接口声明
     * @param string $name 接口名称
     * @param string $url 接口路径
     * @param string $method 请求方式。包括 GET, POST, DELETE
     * @param bool $cross 是否跨域。默认值 true。
     */
    public function __construct(string $desc, string $url, string $method = 'GET', bool $cross = true)
    {
        $this->desc = $desc;
        $this->url = $url;
        $this->method = $method;
        $this->cross = $cross;
    }
    public function getRouteRule($methodRule)
    {
        $desc = $this->desc;
        $method = strtolower($this->method);
        $url = $this->url;
        return "// {$desc}" . PHP_EOL . "Route::{$method}('{$url}','{$methodRule}');";
    }
}

/**
 * 接口参数 注解类
 */
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class ApiDocerParam
{
    public string $name;
    public string $type;
    public string $desc;
    public string $method;
    public mixed $defaultValue;
    public bool $require;

    /**
     * 接口 Post 参数
     * @param string $name 参数名称
     * @param string $type 参数类型。包括 string, int, date
     * @param string $desc 参数描述
     * @param string $method 请求方式。如若不填则默认与 ApiDocer::method 一致。
     * @param mixed $defaultValue 参数默认值
     * @param bool $require 是否必填。默认值 false。
     */
    public function __construct(string $name, string $type, string $desc, string $method = '', mixed $defaultValue = '', bool $require = false)
    {
        $this->name = $name;
        $this->type = $type;
        $this->desc = $desc;
        $this->method = $method;
        $this->defaultValue = $defaultValue;
        $this->require = $require;
    }
}

/**
 * 返回成功结果 注解类
 */
#[Attribute(Attribute::TARGET_METHOD)]
class ApiDocerSuccess
{
    public $msgInfo = [];
    /**
     * 参数返回结果
     * @param mixed $msgInfo 成功返回内容（标准消息格式）
     */
    public function __construct(mixed $msgInfo)
    {
        $this->msgInfo = $msgInfo;
    }
}
/**
 * 返回成功结果 注解类
 */
#[Attribute(Attribute::TARGET_METHOD)]
class ApiDocerFail
{
    public $msgInfo = [];
    /**
     * 参数返回结果
     * @param mixed $msgInfo 失败返回内容（标准消息格式）
     */
    public function __construct(mixed $msgInfo)
    {
        $this->msgInfo = $msgInfo;
    }
}
